﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Ferreteria.Clases;

namespace Ferreteria.Forms.GestionPedidos
{
    public partial class FrmEmitirComprobanteX : Form
    {
        DisancoEntities context;
        Int64 numeroComprobante;
        int pedId;
        DataTable dtLineas;
        decimal subtotal;
        decimal descuento;
        decimal iva;
        decimal subtotcondesc;
        VentasAdicionales VAImprimir;
        decimal incrementoventa;

        public FrmEmitirComprobanteX(int ped_id, decimal incremento)
        {
            InitializeComponent();

            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
            chkIVA.Checked = true;
            pedId = ped_id;
            var pedido = context.Pedido.FirstOrDefault(p => p.ped_id == ped_id);
            var cliente = pedido.Clientes;

            int nroLineas = pedido.LineaPedido.Count;
            incrementoventa = Convert.ToDecimal(incremento / 100);
            //STATUS BAR
            string label = (Convert.ToString(incremento) + " % " );
            StripLabelValorInc.Text = Convert.ToString(label);
            
            //int maxLineas = Clases.Constantes.maximoLineasFactura;

            //Calculo de la cant de facturas necesarias
            //int cantFacturas = 1;
            //while (nroLineas > maxLineas)
            //{
            //    cantFacturas += 1;
            //    nroLineas -= maxLineas;
            //}

            numeroComprobante = obtenerNumeroComprobante();

            txbComprobanteNumero.Text = numeroComprobante.ToString("0000-00000000");
            txbFechaEmision.Text = pedido.ped_fecha.ToShortDateString();

            //Cargar datos del cliente
            txtbCliNombre.Text = pedido.Clientes.cliente_nombre;
            txtbCliLocalidad.Text = pedido.Clientes.cliente_localidad;
            txtbCliDireccion.Text = pedido.Clientes.cliente_direccion;
            txtbCliCondiva.Text = pedido.Clientes.CondicionIVA.condicion_sigla;
            txtbCliCuit.Text = pedido.Clientes.cliente_cuit;

            dtLineas = new DataTable();
            dtLineas.Columns.Add("id");
            dtLineas.Columns.Add("Cantidad");
            dtLineas.Columns.Add("Cod Art.");
            dtLineas.Columns.Add("Articulo");
            dtLineas.Columns.Add("Precio Unitario");
            dtLineas.Columns.Add("Bonif");
            dtLineas.Columns.Add("Precio Bonif");
            dtLineas.Columns.Add("Precio Total");

            subtotal = 0;

            foreach (var linea in pedido.LineaPedido)
            {
                decimal precioU = 0;
                DataRow fila = dtLineas.NewRow();
                fila["id"] = linea.linped_id;
                fila["Cantidad"] = linea.ped_cant;
                fila["Cod Art."] = linea.Articulos.art_codigo;
                fila["Articulo"] = linea.Articulos.art_nombre;
                decimal preciounitincr = linea.ped_precio * (1 + incrementoventa);
                fila["Precio Unitario"] = "$ " + preciounitincr;
                
               
                if (linea.ped_oferta_bonif > 0)
                {
                    fila["Bonif"] = linea.ped_oferta_bonif.ToString("0.00 %");
                    fila["Precio Bonif"] = "$ " + Math.Round(Ferreteria.Clases.Funcion.PrecioBonificado(preciounitincr, linea.ped_oferta_bonif), 2);
                    precioU = Math.Round(Ferreteria.Clases.Funcion.PrecioBonificado(preciounitincr, linea.ped_oferta_bonif), 2);
                    fila["Precio Total"] = "$ " + Math.Round((linea.ped_cant * precioU),2);
                }
                else
                {
                    fila["Bonif"] = "";
                    fila["Precio Bonif"] = "$ " + Math.Round(preciounitincr, 2);
                    precioU = preciounitincr;
                    fila["Precio Total"] = "$ " + Math.Round((precioU * linea.ped_cant),2);
                }
                dtLineas.Rows.Add(fila);
                subtotal += linea.ped_cant * precioU;
            }
            
            dgvListaArt.DataSource = dtLineas;
            dgvListaArt.Columns["id"].Visible = false;
            dgvListaArt.Columns["Articulo"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            dgvListaArt.ColumnHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
            dgvListaArt.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;

            txbSubTotal.Text = "$ " + Math.Round(subtotal, 2);

            calcularTotales();
        }

        Int64 obtenerNumeroComprobante()
        {
            if ((context.VentasAdicionales.Count()) == 0)
                return 1;
            else
                return context.VentasAdicionales.Max(va => va.va_nro_comp_ini) + 1;
        }

        void calcularTotales() //CUANDO CALCULO EL DESCUENTO EN LOS TOTALES USO LA FORMULA NORMAL LA Q PIDIO GROSO,
            //cuando calculo descuento o bonificaciones en las lineas de ventas uso la del COONTADOR /(1+..)
            
        {
            descuento = numDescuento.Value / 100;
            subtotcondesc = Math.Round((Funcion.SubtotDescuento(subtotal, descuento)),2);
            txbTotal.Text = Convert.ToString(subtotcondesc);

        }

        
        private void btnEmitir_Click(object sender, EventArgs e)
        {
            try
            {
                DateTime fechaActual = DateTime.Now;

                context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);
                var pedido = context.Pedido.FirstOrDefault(p => p.ped_id == pedId);

                bool valido = true;
                string lista = "Stock insuficiente para los siguientes articulos:\n";

                //Verificar existencia de stock
                foreach (var linea in pedido.LineaPedido)
                {
                    if (linea.ped_cant > linea.Articulos.art_stock)
                    {
                        valido = false;
                        lista += linea.Articulos.art_nombre + " (" + linea.Articulos.art_stock.ToString() + ")\n";
                    }
                }

                if (valido)
                {
                    //Actualizar stock de cada articulo
                    foreach (var linea in pedido.LineaPedido)
                    {
                        linea.Articulos.art_stock -= linea.ped_cant;
                    }

                    //Registrar la nueva factura
                    VentasAdicionales nuevaVentaAdicional = new VentasAdicionales();
                    nuevaVentaAdicional.cliente_id = pedido.cliente_id;
                    nuevaVentaAdicional.va_fecha = fechaActual;
                    nuevaVentaAdicional.va_estado = Estado.Emitida;
                    nuevaVentaAdicional.va_nro_comp_ini = numeroComprobante;
                    nuevaVentaAdicional.va_nro_comp_fin = numeroComprobante;
                    nuevaVentaAdicional.va_descuento = descuento;
                    nuevaVentaAdicional.va_subtotal = subtotal;
                    nuevaVentaAdicional.va_iva = iva;
            
                    foreach (var lineaPedido in pedido.LineaPedido)
                    {
                        LineaVentaAdicional nuevaLineaVentaAdicional = new LineaVentaAdicional();
                        nuevaLineaVentaAdicional.art_id = lineaPedido.art_id;
                        nuevaLineaVentaAdicional.linva_cant = lineaPedido.ped_cant;
                        nuevaLineaVentaAdicional.linva_precio = lineaPedido.ped_precio;
                        nuevaLineaVentaAdicional.linva_oferta_bonif = lineaPedido.ped_oferta_bonif;
                       
                        nuevaLineaVentaAdicional.linva_precio_bonif = Math.Round(Funcion.PrecioBonificado(lineaPedido.ped_precio, lineaPedido.ped_oferta_bonif), 2);

                        nuevaVentaAdicional.LineaVentaAdicional.Add(nuevaLineaVentaAdicional);
                    }

                    Cuentas nuevaCuenta = new Cuentas();
                    nuevaCuenta.cliente_id = pedido.cliente_id;
                    nuevaCuenta.cuenta_fecha = fechaActual;

                    nuevaCuenta.cuenta_monto = subtotcondesc + iva;
                    nuevaCuenta.cuenta_pagado = 0;
                    nuevaVentaAdicional.Cuentas = nuevaCuenta;


                    context.Pedido.DeleteObject(pedido);
                    context.VentasAdicionales.AddObject(nuevaVentaAdicional);
                    context.SaveChanges();

                   
                    MessageBox.Show("Comprobante Generado Correctamente", "Operación Exitosa!!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                  
                    //DialogResult dr = MessageBox.Show("¿Desea Imprimir este Comprobante?", "Imprimir", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                    //if (dr == System.Windows.Forms.DialogResult.Yes)
                    //{
                        
                        ImprimirComprobante(nuevaVentaAdicional);
                    // }
                    //this.Close();
                }
                else
                {
                    MessageBox.Show(lista);
                }
            }
            catch (Exception err)
            {
                MessageBox.Show(err.ToString());
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void numDescuento_ValueChanged(object sender, EventArgs e)
        {
            calcularTotales();
        }
       
        private Font printFont = new Font("Calibri", 11);
        private Font FontTit = new Font("Calibri", 12);
        private Font miniprintFont = new Font("Calibri", 8);
        private Font printFontNormal10 = new Font("Calibri", 10);
  
        private void ImprimirComprobante(VentasAdicionales nuevaVentaAdicional)
        {
            VAImprimir = new VentasAdicionales();
            VAImprimir = nuevaVentaAdicional;

            printDialogCompX.PrinterSettings.Copies = 3;
          

            DialogResult resultunico = printDialogCompX.ShowDialog();

            if (resultunico == DialogResult.OK)
            {
                printDocumentX.PrinterSettings = printDialogCompX.PrinterSettings;
                printPrevDCompX.Document = printDocumentX;
                ((Form)printPrevDCompX).WindowState = FormWindowState.Maximized;
                printPrevDCompX.ShowDialog();
            }
        }

        private void printDocumentX_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            context = new DisancoEntities(Ferreteria.Clases.Constantes.cadenaConexion);

            int margenX = 25;
            int margenY = 50;
            int anchoHoja = 800;

            PointF punto = new PointF();
            punto.X = anchoHoja / 2;
            punto.Y = margenY + 30;

            StringFormat formato = new StringFormat();
            formato.Alignment = StringAlignment.Center;

            
            e.Graphics.DrawString("Documento No Valido Como Factura", FontTit, Brushes.Black, 310, 20);
            e.Graphics.DrawString(" X ", FontTit, Brushes.Black, 400, 7);

            string comprobnumero = numeroComprobante.ToString("0000-00000000");
            e.Graphics.DrawString(comprobnumero, FontTit, Brushes.Black, 550, 40);
            e.Graphics.DrawString("Número:", FontTit, Brushes.Black, 520, 40, formato);

            string fecha = DateTime.Now.Date.ToString("dd/MM/yyyy");
            e.Graphics.DrawString("Fecha:", FontTit, Brushes.Black, 525, 70, formato);
            e.Graphics.DrawString(fecha, FontTit, Brushes.Black, 550, 70);

            e.Graphics.DrawLine(Pens.Black, 10, 120, 800, 120);
            e.Graphics.DrawString(VAImprimir.Clientes.cliente_nombre, printFont, Brushes.Black, 130, 130);
            e.Graphics.DrawString(VAImprimir.Clientes.cliente_direccion, printFont, Brushes.Black, 130, 150);
            e.Graphics.DrawString(VAImprimir.Clientes.cliente_localidad, printFont, Brushes.Black, 550, 150);
            e.Graphics.DrawString(VAImprimir.Clientes.CondicionIVA.condicion_sigla, printFont, Brushes.Black, 130, 170);
            e.Graphics.DrawString(VAImprimir.Clientes.cliente_cuit, printFont, Brushes.Black, 550, 170);
            e.Graphics.DrawLine(Pens.Black, 10, 200, 800, 200);

            e.Graphics.DrawString("Cliente:", printFont, Brushes.Black, 90, 130, formato);
            e.Graphics.DrawString("Dirección:", printFont, Brushes.Black, 80, 150, formato);
            e.Graphics.DrawString("Localidad:", printFont, Brushes.Black, 500, 150, formato);
            e.Graphics.DrawString("Cond. IVA:", printFont, Brushes.Black, 80, 170, formato);
            e.Graphics.DrawString("CUIT:", printFont, Brushes.Black, 520, 170, formato);

            //int lnverticalesIn = 208;
            //int lnverticalesFin = 980;

            int posYencab = 205;
            String Cant = "Cantidad";
            e.Graphics.DrawString(Cant, printFontNormal10, Brushes.Black, 22, posYencab);
            //e.Graphics.DrawString(Cant, printFont, Brushes.Black, 82, 210);
            //e.Graphics.DrawLine(Pens.Gray, 155, lnverticalesIn, 155, lnverticalesFin);

            String Cod = "Codigo Art.";
            e.Graphics.DrawString(Cod, printFontNormal10, Brushes.Black, 77, posYencab);
            //e.Graphics.DrawString(Cod, printFont, Brushes.Black, 180, 210);
            //e.Graphics.DrawLine(Pens.Gray, 265, lnverticalesIn, 265, lnverticalesFin);

            String Art = "Articulo";
            e.Graphics.DrawString(Art, printFontNormal10, Brushes.Black, 310, posYencab);
            //e.Graphics.DrawLine(Pens.Gray, 585, lnverticalesIn, 585, lnverticalesFin);

            String PrecioU = "Precio U";
            e.Graphics.DrawString(PrecioU, printFontNormal10, Brushes.Black, 577, posYencab);
            //e.Graphics.DrawLine(Pens.Gray, 680, lnverticalesIn, 680, lnverticalesFin);

            String Bonif = "Bonif.";
            e.Graphics.DrawString(Bonif, printFontNormal10, Brushes.Black, 630, posYencab);
            
            String PrecioOf = "Precio Of";
            e.Graphics.DrawString(PrecioOf, printFontNormal10, Brushes.Black, 680, posYencab);

            String Importe = "Total";
            e.Graphics.DrawString(Importe, printFontNormal10, Brushes.Black, 750, posYencab);
             //e.Graphics.DrawLine(Pens.Gray, 780, lnverticalesIn, 780, lnverticalesFin);

            int posY = posYencab + 20;
            int anchoLinea = 18;
            int posCantidad = margenX + 15;
            int posCod = posCantidad + 42;
            int posArticulo = posCod + 60;
            int posPrecioU = posArticulo + 436;
            int posBonif = posPrecioU + 57;
            int posPrecioOf = posBonif + 52;
            int posPrecioT = posPrecioOf + 62;

            foreach (DataRow fila in dtLineas.Rows)
            {
                e.Graphics.DrawString(fila["Cantidad"].ToString(), printFontNormal10, Brushes.Black, posCantidad, posY);
                e.Graphics.DrawString(fila["Cod Art."].ToString(), printFontNormal10, Brushes.Black, posCod, posY);
                e.Graphics.DrawString(fila["Articulo"].ToString(), printFontNormal10, Brushes.Black, posArticulo, posY);
                e.Graphics.DrawString(fila["Precio Unitario"].ToString(), printFontNormal10, Brushes.Black, posPrecioU, posY);
                e.Graphics.DrawString(fila["Bonif"].ToString(), printFontNormal10, Brushes.Black, posBonif, posY);
                e.Graphics.DrawString(fila["Precio Bonif"].ToString(), printFontNormal10, Brushes.Black, posPrecioOf, posY);
                e.Graphics.DrawString(fila["Precio Total"].ToString(), printFontNormal10, Brushes.Black, posPrecioT, posY);

                posY += anchoLinea;
            }

            int lineafin = 1025;
            int posSubtotX = 90;

            // Comentario abajo X
            string comentariox = txtbComentarioX.Text;
            e.Graphics.DrawString(comentariox, printFont, Brushes.Black, posSubtotX - 20, lineafin - 45);

            e.Graphics.DrawLine(Pens.Black, 10, 1005, 825, 1005);

            String subtot = "SUB-TOTAL $";
            e.Graphics.DrawString(subtot, printFont, Brushes.Black, posSubtotX , lineafin);
            e.Graphics.DrawString(Convert.ToString(VAImprimir.va_subtotal), printFont, Brushes.Black, posSubtotX + 110, lineafin);

            //decimal descuento = Math.Round(Convert.ToDecimal((VAImprimir.va_subtotal)-(VAImprimir.va_monto-VAImprimir.va_iva)),2);
           
            decimal descuento = Math.Round((VAImprimir.va_subtotal * VAImprimir.va_descuento), 2);
            String desc = "Descuento $";
            e.Graphics.DrawString(desc, printFont, Brushes.Black, posSubtotX + 220, lineafin);
            e.Graphics.DrawString(Convert.ToString(descuento), printFont, Brushes.Black, posSubtotX + 342, lineafin);
            e.Graphics.DrawString(VAImprimir.va_descuento.ToString("0.00 %"), miniprintFont, Brushes.Black, posSubtotX + 310, lineafin + 4);

            //String iva = "IVA $";
            //e.Graphics.DrawString(iva, printFont, Brushes.Black, posSubtotX + 425, lineafin);
            //e.Graphics.DrawString(Convert.ToString(VAImprimir.va_iva), printFont, Brushes.Black, posSubtotX + 475, lineafin);

            String tot = "TOTAL  $";
            e.Graphics.DrawString(tot, printFont, Brushes.Black, posSubtotX + 565, lineafin);
            decimal total = Decimal.Round(Convert.ToDecimal(VAImprimir.va_monto), 2);
            e.Graphics.DrawString(Convert.ToString(total), printFont, Brushes.Black, posSubtotX + 650, lineafin);
        }

        private void chkIVA_CheckedChanged(object sender, EventArgs e)
        {
            calcularTotales();
        }
    }
}
